home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload Trio 2 / Shareware Overload Trio Volume 2 (Chestnut CD-ROM).ISO / dir24 / psi110g.zip / RDATE.C < prev    next >
C/C++ Source or Header  |  1994-04-17  |  3KB  |  146 lines

  1. /* Internet rdate client
  2.  * Author: Brian Teravskis, WD0EFL
  3.  * Date: 03/30/92
  4.  *
  5.  * Based on RFC868 Time Protocol
  6.  *
  7.  * Added local hour offset - Doug Crompton 10/28/92
  8.  * and subcommand menu for possible future commands
  9.  */
  10. #include "global.h"
  11. #ifdef RDATE
  12. #include "mbuf.h"
  13. #include "socket.h"
  14. #include "session.h"
  15. #include "proc.h"
  16. #include "netuser.h"
  17. #include "commands.h"
  18. #include "tty.h"
  19. #include "timer.h"
  20. #include <time.h>
  21. #include "cmdparse.h"
  22.   
  23. #define IPPORT_TIME 37
  24. #define DIFFTIME 2208988800L
  25. #define RDATETIMEOUT 30
  26.   
  27. static void rdate_timeout __ARGS((void *));
  28. static int rdate_offset=0;
  29.   
  30. static int dordateserver __ARGS((int argc,char *argv[],void *p));
  31. static int dordateoff __ARGS((int argc,char *argv[],void *p));
  32.   
  33. static struct cmds rdatecmds[] = {
  34.     "server", dordateserver, 512, 2,
  35.     "rdate server <address>",
  36.   
  37.     "offset", dordateoff, 0, 0,
  38.     NULLCHAR,
  39.   
  40.     NULLCHAR,
  41. };
  42.   
  43. int
  44. dordate(argc,argv,p)
  45. int argc;
  46. char *argv[];
  47. void *p;
  48. {
  49.     return subcmd(rdatecmds,argc,argv,p);
  50. }
  51.   
  52. static int
  53. dordateserver(argc,argv,p)
  54. int argc;
  55. char *argv[];
  56. void *p;
  57. {
  58.     struct sockaddr_in sock;
  59.     int s,i_state;
  60.     struct mbuf *bp;
  61.     struct timer *t;
  62.     time_t rtime, raw_time;
  63.   
  64.     if((sock.sin_addr.s_addr = resolve(argv[1])) == 0){
  65.         log(-1,"RDATE:Host %s unknown\n",argv[1]);
  66.         return 1;
  67.     }
  68.     sock.sin_family = AF_INET;
  69.     sock.sin_port = IPPORT_TIME;
  70.   
  71.     /* Open connection to time server */
  72.     if((s = socket(AF_INET,SOCK_STREAM,0)) == -1) {
  73.         log(-1,"RDATE:Can't create socket");
  74.         return 1;
  75.     }
  76.     sockmode(s,SOCK_BINARY);
  77.   
  78.     /* Set timeout timer */
  79.     t = (struct timer *)callocw(1, sizeof(struct timer));
  80.     t->func = rdate_timeout;
  81.     t->arg = (void *) &s;
  82.     set_timer(t,RDATETIMEOUT*1000L);
  83.     start_timer(t);
  84.   
  85.     /* Connect to time server */
  86.     if(connect(s,(char *)&sock,sizeof(sock)) == -1){
  87.         /* Connect failed */
  88.         stop_timer(t);
  89.         free(t);
  90.         log(s,"RDATE: Connect failed");
  91.         close_s(s);
  92.         return 1;
  93.     }
  94.     /* Successful connect, stop timout timer */
  95.     stop_timer(t);
  96.     free(t);
  97.     /* Get time info sent by server */
  98.     recv_mbuf(s,&bp,0,NULLCHAR,(int *)0);
  99.     rtime = (time_t)pull32(&bp);
  100.     /* Convert 1900 start date to 1970 start date */
  101.     rtime -= DIFFTIME;
  102.     raw_time=rtime;
  103.     rtime += (rdate_offset*3600L);
  104.     /* Set the system time */
  105.     i_state = dirps();
  106.     stime(&rtime);
  107.     restore(i_state);
  108.     log(s,"RDATE:Clock set to %s from %s\n",ctime(&rtime),argv[1]);
  109.     printf("\nTime received from %s - %s",argv[1],ctime(&raw_time));
  110.     printf("System time set to %s\n",ctime(&rtime));
  111.     free_q(&bp);
  112.     close_s(s);
  113.     return 0;
  114. } /* dordate */
  115.   
  116. /*
  117.  * Close socket after timeout on connect
  118.  */
  119. static void
  120. rdate_timeout(arg)
  121. void *arg;
  122. {
  123.     int     *s;
  124.   
  125.     s = (int *)arg;
  126.     close_s(*s);
  127. } /* rdate_timeout */
  128.   
  129. /* Set time offset */
  130. static int
  131. dordateoff(argc, argv,p)
  132. int argc;
  133. char *argv[];
  134. void *p;
  135. {
  136.     if(argc < 2) {
  137.         tprintf("Usage: 'rdate offset <+-hours>' - Current Offset %d Hours\n",rdate_offset);
  138.         return 0 ;
  139.     }
  140.   
  141.     rdate_offset = atoi(argv[1]);
  142.     return 0;
  143. }
  144. #endif /* RDATE */
  145.   
  146.